package Hot100;

import common.ListNode;

import java.util.List;

/**
 * @author zhangmin
 * @create 2021-12-21 11:34
 */
public class mergeKLists23 {
    /**23. 合并K个升序链表
     *给你一个链表数组，每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中，返回合并后的链表。
     * 分治合并，当划分到只有两个时调用合并两个链表的
     * */
    public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
        if (list1==null) return list2;
        if (list2==null) return list1;

        ListNode root=new ListNode(-1);
        ListNode head=root;
        while (list1!=null&&list2!=null){
            if (list1.val<=list2.val){
                root.next=new ListNode(list1.val);
                list1=list1.next;
            }else {
                root.next=new ListNode(list2.val);
                list2=list2.next;
            }
            root=root.next;
        }
        root.next=list1==null?list2:list1;
        return head.next;
    }
    //分治合并从l到r的链表
    ListNode merge(ListNode[] lists,int l,int r){
        if (l==r) return lists[l];
        if (l>r) return null;
        int mid=l+(r-l)/2;
        return mergeTwoLists(merge(lists,l,mid),merge(lists,mid+1,r));
    }
    public ListNode mergeKLists(ListNode[] lists) {
        return merge(lists,0,lists.length-1);
    }
}
